#include <stdio.h>
#include <time.h>
#include <stdlib.h>


void use_pointer_one(void){
	int var=20; //实际变量的声明
	int *ip; //指针变量的声明

	ip=&var;//在指针变量中存储 var 的地址

	printf("Address of var variable %x \n",&var);

	//在指针变量中存储的地址
	printf("Address of ip variable %x \n",ip);

	//使用指针访问值
	printf("Address of *ip variable %d \n",*ip);

	//查看真实值
	printf("value of var is %d \n",var);
}

/*
指针变量赋值为 NULL 值是一个良好的编程习惯，
赋值为NULL值的指针被称为空指针。
*/
void use_null_pointer(void){
	int *ptr=NULL;
	//%x 十六进制
	printf("ptr 的值是 %x \n",ptr);
	//%d 十进制
	printf("ptr 的值是- %d \n",ptr);

	if(ptr)
		printf("ptr非空");
	
	if(!ptr)
		printf("ptr为空");
	
}

/*指针递增*/
void use_pointer_two(){
	int var[]={10,100,200};
	int i,*ptr;
	
	/*指针中的数组地址*/
	ptr=var;

	for(i=0;i<3;i++){
		printf("存储地址: var[%d] =%x \n",i,ptr);
		printf("存储值：var[%d] = %d \n",i,*ptr);
		/*指针移动到下一个位置*/
		ptr++;
	}
}

/*指针递减2017/1/3*/
void use_pointer_three(){
	int var[]={10,100,200};
	int i,*ptr;
	
	/*指针中的数组的最后一个元素的地址☆☆☆☆☆☆*/
	ptr=&var[2];

	for(i=3;i>0;i--){
		printf("存储地址: var[%d] =%x \n",i-1,ptr);
		printf("存储值：var[%d] = %d \n",i-1,*ptr);
		/*指针移动到下一个位置*/
		ptr--;
	}
}

/*指针比较2017/1/3 */
void use_pointer_four(){
	int var[]={10,100,200};
	int i,*ptr;
	
	/*指针中的数组地址*/
	ptr=var;
	i=0;
	while(ptr<=&var[2]){
		printf("存储地址: var[%d] =%x \n",i,ptr);
		printf("存储值：var[%d] = %d \n",i,*ptr);
		/*指针移动到下一个位置*/
		ptr++;
		i++;
	}
}

void use_pointer_five(){
	int var[]={10,100,200};
	int i,*ptr;
	
	/*指针中的数组地址*/
	ptr=var;

	for(i=0;ptr<=&var[2];i++){
		printf("存储地址: var[%d] =%x \n",i,ptr);
		printf("存储值：var[%d] = %d \n",i,*ptr);
		/*指针移动到下一个位置*/
		ptr++;
	}
}

/*传递指针中的地址*/
void use_pointer_six(){
	int var[] ={10,100,200};
	int i,*ptr[3];

	for(i=0;i<3;i++){
		ptr[i]=&var[i];//将地址给对方
	}
	for(i=0;i<3;i++){
		printf("address of var[%d] = %x\n",i,ptr[i]);
		printf("value of var[%d] = %d\n",i,*ptr[i]);
	}

}

/*用一个指向字符的指针数组来存储一个字符串列表*/
void use_pointer_seven(){
	char *names[]={"Zara Ali","Hina Ali","Nuha Ali","Sara Ali"};

	int i=0;
	for(;i<4;i++){
		printf("address of names[%d] = %s\n",i,*names[i]);
		printf("value of names[%d] = %s\n",i,names[i]);
	}
}

/*指向指针的指针*/
/*指向指针的指针是一种多级间接寻址的形式，或者说是一个指针链。通常，一个指针包含一个变量的地址。
当我们定义一个指向指针的指针时，第一个指针包含了第二个指针的地址，第二个指针指向包含实际值的位置。*/
void use_pointer_eight(){
	int var;
	int *ptr;
	int **pptr;
	
	var=300;
	/*获取 var 的地址*/
	ptr=&var;

	/*使用运算符 & 获取 ptr 的地址*/
	pptr=&ptr;

	/*使用 pptr 获取值*/
	printf("value of var = %d \n",var);
	printf("value of *ptr = %d \n",*ptr);
	printf("value of **pptr = %d \n",**pptr);

	printf("address of var = %x \n",&var);
	printf("address of *ptr = %x \n",ptr);
	printf("address of **pptr = %x \n",pptr); //地址是 *ptr
}

void getSeconds(unsigned long *par){
	/* 获取当前的秒数 */
	*par=time(NULL);
//	return;
}

/*传递参数的指针给别的函数  在别的函数中修改该地址数据*/
void use_pointer_nine(){
	unsigned long sec;

	getSeconds(&sec);

	/*输出被修改后的值*/
	printf("Number of seconds: %d \n",sec);
}

double getAverage(int *arr,int size){
	int i,sum=0;
	double avg;
	for (i=0;i<size;++i){
		sum+=arr[i];
	}
	avg=(double)sum/size;
	return avg;
}

void use_pointer_ten(){
	/*声明定义一个 带有5个元素的整型数组*/
	int balace[]={1000,2,3,17,50};
	double avg;
	/*传递数组的指针 作为参数*/
	avg=getAverage(balace,5);//数组名就代表了数组的地址 所以不需要&获取地址

	/*输出返回值*/
	printf("value of avg=%f\n",avg);
}

/*要生成和返回随机数的函数*/
int * getRandom(){
	static int r[10];
	int i;
	/* 设置种子 */
	srand((unsigned)time(NULL));
	for (i=0;i<10 ;++i )
	{
		r[i]=rand();
		printf("%d\n",r[i]);
	}
	return r;
}

void use_pointer_eleven(){
	/*一个指向整型的指针*/
	int *p;
	int i;

	p=getRandom();
	for (i=0;i<10 ;i++ ){
		printf("*(p+[%d]) : %d\n",i,*(p+i));
	}
}

int main(){
	/*指针的基础使用*/
	//use_pointer_one();
	//use_null_pointer();
	//use_pointer();
	//use_pointer_three();

	/*指针的算术运算*/
	//use_pointer_four();
	//use_pointer_five();

	/*指针数组*/
	//use_pointer_six();
	//use_pointer_seven();

	/*指向指针的指针*/
	//use_pointer_eight();

	/*传递指针给函数*/
	//use_pointer_nine();
	//use_pointer_ten();

	/*从函数返回指针*/
	use_pointer_eleven();

	return 0;
}